home *** CD-ROM | disk | FTP | other *** search
- StackCheck 1.0
- geschrieben von Günther Röhrich
- dieses Programm ist Public Domain
-
-
- EINLEITUNG
-
- StackCheck ist ein Programm, das den maximalen Verbrauch an Stapelspeicher
- (Stack) eines anderen Programms bestimmen kann. Es arbeitet nach einer ganz
- anderen Methode als alle anderen Stackanzeiger wie z.B. WatchStack oder Xoper.
- Dieses Programm ist ausschließlich für Entwickler gedacht, die den Stapel-
- verbrauch ihrer Programme untersuchen wollen.
-
- VORTEILE
-
- - Es wird der tatsächliche maximale Stapelverbrauch angezeigt, und nicht
- der Maximalwert von einer Vielzahl von Einzelmessungen. Daher werden auch
- sehr kurze Spitzenwerte im Stapelverbrauch erfaßt. (Unter "Spitzenwert"
- verstehe ich einen Stapelverbrauch, der nur wenige Taktzyklen dauert)
-
- - StackCheck braucht nicht während der ganzen Laufzeit eines Programms aktiv
- zu sein. Es genügt, wenn es beim Starten des Programms sowie kurz vor der
- Beendigung aktiv ist.
-
- - Der Stapelverbrauch wird auch dann korrekt erfaßt, wenn das zu unter-
- suchende Programm das Multitasking während seiner Laufzeit zwischen-
- zeitlich abschaltet.
-
- - Bei Programmen, die von der Workbench aus gestartet wurden, genügt es sogar
- wenn StackCheck kurz vor der Beendigung des Programms aktiv war. Der
- maximale Stapelverbrauch wird trotzdem korrekt ermittelt.
-
- NACHTEILE
-
- - Der Stapelverbrauch kurz nach Beginn und kurz vor dem Ende eines Programms
- kann nicht erfaßt werden. (Unter "kurz" verstehe ich ca. 0,04 Sekunden)
- Ausnahme: Bei Programmen, die von der Workbench aus gestartet wurden,
- wird der Stapelverbrauch auch unmittelbar nach Beginn korrekt erfaßt.
-
- - Unter Kickstart 1.2/1.3 können keine Programme untersucht werden, die vom
- CLI/Shell aus gestartet wurden. (siehe später)
-
- - Ab Kickstart 2.0 können keine BCPL-Programme mit StackCheck untersucht
- werden. (Es kommt dabei höchstwahrscheinlich zu einem Absturz)
-
-
- BENÖTIGTER COMPUTER/BETRIEBSSYSTEM
-
- StackCheck läuft auf allen AMIGAs mit allen Kickstart-Versionen und mit allen
- Prozessoren.
- Getestete Konfigurationen:
-
- A500 Kickstart 2.04/1.3 Prozessor: 68000
- A1200 Kickstart 3.00 Prozessor: 68EC020
- A3000 Kickstart 2.04 Prozessor: 68030
-
-
- BENUTZUNG VON STACKCHECK
-
- Die Syntax von Stackcheck lautet:
-
- StackCheck Name|* [DELAY=n][PRI=n][STACK=n][NUM=n]
-
- Ein Abbruch ist durch Drücken von CTRL-C jederzeit möglich.
-
- Name
-
- Der Name des zu untersuchenden Programmes muß als erstes Argument angegeben
- werden. Es wird auf Groß- und Kleinschreibung geachtet. Wenn der Name Leer-
- zeichen enthält muß er in Hochkommas angegeben werden. Das Zeichen "*" steht
- für jeden beliebigen Namen. Wildcards werden nicht unterstützt.
-
- Alle anderen Optionen sind wahlfrei. Werden sie weggelassen wird ein inter-
- ner Defaultwert benützt. Für n muß eine Zahl eingegeben werden.
- (z.B. stack=20000)
-
-
- DELAY=n
-
- n gibt die Zeitspanne zwischen zwei Überprüfungen des Stapels an. Die
- Einheit ist eine 1/50 Sekunde. Der Defaultwert ist 2.
-
-
- PRI=n
-
- Setzt die Taskpriorität von StackCheck auf n. Der Defaultwert ist 1.
-
-
- STACK=n
-
- Es wird nur ein Programm untersucht, dessen Stapelgröße gleich n ist.
- (Nützlich wenn "*" als Name angegeben wurde)
-
-
- NUM=n
-
- Es wird nur ein Programm untersucht, dessen CLI-Nummer gleich n ist. Die Nummer
- des CLI wird normalerweise im CLI/Shell-Prompt angegeben.
- (Nützlich wenn "*" als Name angegeben wurde)
-
-
- ARBEITSWEISE VON STACKCHECK
-
- Bemerkung: Wer mit der Funktionsweise des Prozessorstapels nicht vertraut ist,
- der sollte sich vorerst das Kapitel "Arbeitsweise des Stapels" durchlesen.
-
- Die Arbeitsweise von StackCheck beruht darauf, daß der noch unbenutzte Bereich
- des Stapels mit dem Füllmuster $BEEF aufgefüllt wird. Wenn ein Programm mehr
- Stapelspeicher benutzt wird das Füllmuster beschädigt. Um den maximalen Ver-
- brauch an Stapelspeicher festzustellen genügt es somit abzuzählen, bis wohin
- das Füllmuster noch nicht überschrieben wurde. Da es jedoch nicht bekannt ist,
- wann das Programm beendet wird, muß diese Messung ständig wiederholt werden.
- Was zählt ist das Ergebnis der letzten Messung.
-
- Beim Start von StackCheck wird als erstes untersucht, ob das Programm bereits
- läuft. Wenn nicht wird eine bestimmte Zeitspanne gewartet und es wird dann
- erneut geprüft, ob das Programm in der Zwischenzeit gestartet wurde.
- (Die Zeitspanne kann durch die DELAY-Option eingestellt werden)
-
- Wenn das gesuchte Programm gefunden ist, wird der Zustand der ersten zwei
- Worte am Stapelende untersucht. (Stapelende = unteres Ende des Stapels)
- Wenn das Füllmuster $BEEF gefunden wurde wird nichts weiter getan. Wenn
- lauter Nullen gefunden werden, so wurde das Programm höchstwahrscheinlich
- von der Workbench aus gestartet. Zu Beginn des Programms war der Stapel
- daher komplett mit Nullen aufgefüllt. Es werden dann alle Nullen beginnend
- vom unteren Ende des Stapels durch das Füllmuster $BEEF ersetzt. Sobald
- das erste Wort gefunden wurde, das nicht Null enthält, wird dieser Vorgang
- abgebrochen. Dies ist gleichzeitig die Stelle des bisherigen maximalen
- Stapelverbrauchs. Der Füllvorgang wird jedoch höchstens bis zum aktuellen
- Stapelzeiger durchgeführt, um das Programm nicht zu beeinträchtigen.
- Wenn die ersten zwei Worte am unteren Ende des Stapels eine unbekannte
- Bytekombination enthalten wird der Stapel bis zum aktuellen Stapelzeiger
- mit $BEEF aufgefüllt. (Dies ist der Fall, wenn das Programm vom CLI/Shell
- aus gestartet wurde.) Es somit nicht möglich festzustellen, wie groß der
- maximale Stapelverbrauch bisher gewesen ist.
-
- Nach Abschluß dieser Vorarbeit wird nun laufend überprüft, wie weit das
- Füllmuster $BEEF noch unbeschädigt geblieben ist. Dies kennzeichnet die
- Stelle des bisherigen maximalen Stapelverbrauch. Der Vorgang wird abge-
- brochen, sobald das Programm endet oder CTRL-C gedrückt wurde.
- (Die Pause zwischen zwei Überprüfungen kann mit der DELAY-Option einge-
- stellt werden)
-
- Nach Beendigung wird das Ergebnis der letzten Überprüfung ausgegeben.
- Sämtliche Zwischenergebnisse werden verworfen. Es ist daher gar nicht
- nötig, daß StackCheck während der gesamten Laufzeit des zu untersuchenden
- Programms seine Messungen durchführt.
- Wenn bekannt ist, wann das Programm endet, empfiehlt es sich StackCheck
- mit CTRL-C abzubrechen, sobald das Programm gestartet wurde. Kurz vor dem
- Ende des Programms muß StackCheck erneut aufgerufen werden. Wenn das Programm
- endet werden dann die gleichen Ergebnisse ausgegeben, als wenn StackCheck die
- ganze Zeit aktiv gewesen wäre.
- Bei Programmen, die von der Workbench aus gestartet wurden, genügt es sogar
- wenn StackCheck bei der Beendigung des Programms aktiv gewesen war. Es
- empfiehlt sich jedoch StackCheck auch bei Beginn zu aktivieren, damit die
- Nullen durch das zuverlässigere Füllmuster $BEEF ersetzt werden.
-
-
- DIE AUSWERTUNG DER AUSGABE VON STACKCHECK
-
- Eine typische Ausgabe von StackCheck sieht folgendermaßen aus:
-
- StackCheck V1.0 by Günther Röhrich
- This program is Public Domain. Press CTRL-C to abort.
-
- Free stack area contained unknown pattern:
- 00290F58: 000A3EDF 00000FA0 00292454 00000001
- Stack OK:
- 00290F58: BEEFBEEF BEEFBEEF BEEFBEEF BEEFBEEF
- Stacksize: 4000
- Used max: 2818
-
- Als erstes werden die ersten 16 Bytes beginnend vom unteren Ende des Stapels
- ausgegeben so wie sie von StackCheck vorgefunden wurden. Die Zahl vor dem
- Doppelpunkt gibt die Adresse des unteren Endes des Stapels an. Dann folgt zum
- Vergleich der gleiche Ausschnitt des Stapels wie er bei der letzten Über-
- prüfung ausgesehen hat. Sollte der Stapel "übergelaufen" sein wird ein
- entsprechender Hinweis ausgegeben. Es ist jedoch nicht möglich festzustellen,
- um wieviel der Stapel übergelaufen ist. Dann folgt die Angabe der Gesamtgröße
- des Stapels sowie der bisherige maximale Stapelverbrauch.
- Wenn StackCheck durch CTRL-C abgebrochen wurde wird zusätzlich die Größe des
- zum Zeitpunkt des Abbruchs benützten Stapels ausgegeben.
- Wenn festgestellt wurde, daß ein Stapelbereich außerhalb des von StackCheck
- angenommenen Bereichs benützt wurde, wird ein entsprechender Hinweis ausgegeben.
- (Möglich ist es z.B. mit Hilfe der StackSwap() Funktion der Exec-Library)
- Es ist jedoch nicht immer möglich dies festzustellen.
-
-
- PROBLEME
-
- Eingangs wurde erwähnt, daß der Stapelverbrauch kurz nach Beginn und kurz
- vor dem Ende eines Programms nicht erfaßt werden kann. Wenn jemand selber
- ein Programm schreibt um es mit StackCheck zu untersuchen, so empfiehlt es
- sich am Anfang und Ende des Programms eine kurze Verzögerung einzubauen.
- (z.B. mit dem Befehl Delay(50)) Noch besser ist es, wenn der Start und
- das Ende des Programms eine Interaktion mit dem Benutzer beinhalten.
-
- Unter Kickstart 1.2/1.3 sollte man nur Programme untersuchen, die von der
- Workbench aus gestartet wurden. Andernfalls kann es zu Abstürzen kommen.
-
- Weiterhin ist die Untersuchung von BCPL-Programmen ab Kickstart 2.0 nicht
- möglich, da dies zu einem Absturz führt. (Es wird dabei ein Bereich im nor-
- malerweise unbenutzten Teil des Stapels benutzt. Dieser Bereich wird durch
- StackCheck mit $BEEF überschrieben.) Da BCPL-Programme ab Kickstart 2.0
- normalerweise nicht verwendet werden, habe ich darauf verzichtet gegen
- diesen Fehler etwas zu unternehmen.
-
- Wenn Programme den unbenützten Teil des Stapels für irgendwelche Zwecke ver-
- wenden. (z.B. um selber einen Überlauf des Stapels feststellen zu können) kann
- es zu Problemen kommen. Wenn jemand ein derartiges Programm haben sollte so
- möge er/sie bitte mit mir in Kontakt treten. (ich selber habe keines)
-
- Bei mehreren Abläufen eines Programmes kann es durchaus vorkommen daß StackCheck
- leicht abweichende Werte für den maximalen Stapelverbrauch anzeigt, selbst wenn
- das Programm stets die gleichen Aktivitäten durchführt. Dies ist kein Fehler von
- StackCheck, es hängt davon ab, zu welchem Zeitpunkt das Programm zwecks Task-
- Switching oder Interrupts unterbrochen wird. (In diesem Fall werden zusätzlich
- ca. 70 Bytes auf dem Stack abgelegt.)
-
-
- ARBEITSWEISE DES STAPELS
-
- Dieses Kapitel ist für diejenigen gedacht, die mit der Arbeitsweise des
- Prozessorstapels nicht vertraut sind. Assemblerprofis brauchen es nicht
- unbedingt durchzulesen.
-
- Der Prozessorstapel der MC680x0 Prozessoren wächst von höheren Adressen
- in Richtung niedriger Adressen. Als Stapelzeiger dient das Register A7, das
- stets auf den letzten gültigen Eintrag auf dem Stapel weist. Um Adress-
- fehler zu vermeiden wird das Register A7 auf einer geraden Adresse gehalten,
- selbst wenn nur ein Byte auf dem Stapel abgelegt werden sollte. Aus Kompatibi-
- litätsgründen wird dies ab dem 68020 immer noch eingehalten, obwohl es keine
- Adressfehler mehr geben kann.
- Der Stapel selbst kann beliebig groß werden, auf eine Einhaltung der Stapel-
- grenzen wird nicht geachtet. (Mit Hilfe einer MMU wäre dies jedoch möglich)
- Der Stapel dient zur Aufnahme temporärer Variablen sowie von Rücksprung-
- adressen des Prozessors bei Unterprogrammaufrufen. Außerdem wird im Falle
- einer Unterbrechung (Interrupt) der Zustand des Prozessors auf dem Stapel
- abgelegt, damit das Programm später an der gleichen Stelle wieder fortgesetzt
- werden kann.
- Auf dem AMIGA wird der Stapelzeiger bei einer Unterbrechung des Programms
- in der Variablen SPReg der Task-Struktur abgelegt. Das obere und untere Ende
- des Stapels steht in den Einträgen SPUpper und SPLower. (Gilt nicht immer bei
- Kickstart 1.2/1.3)
-
-
- ADRESSE DES AUTORS UND SONSTIGE HINWEISE
-
- Da StackCheck Public Domain ist, steht es jedem frei Änderungen daran vorzu-
- nehmen oder es weiter zu verbreiten. Um eine Verwirrung unter den Anwendern
- zu verhindern halte ich es jedoch für ratsam, keine veränderten Versionen von
- StackCheck in Umlauf zu bringen ohne zuvor mit mir in Kontakt getreten zu sein.
- Wer einen Fehler finden sollte möge mich bitte informieren. Ich wäre ebenfalls
- dankbar, wenn jemand mir eine korrigierte Fassung der englischen Anleitung
- zuschicken würde, da es mit meinen Englischkenntnissen nicht gerade zum Besten
- steht.
-
- Adresse:
-
- Günther Röhrich
- Lerchenbergstr. 4
- W-7300 Esslingen
- Deutschland
-
-
- Neue Adresse beginnend vom 1. Juli 1993:
-
- Günther Röhrich
- Lerchenbergstr. 4
- 73733 Esslingen
- Deutschland
-